package com.tom.architect02.mnbase.annotation.apt.celue;

import java.util.Iterator;
import java.util.ServiceLoader;

/**
 * Added by Tom on 2024/04/25.
 */
public class MainJava {

    public static void main(String[] args) {
        // 传入不同的策略，执行不同的策略的方法。
//        Content content = new Content(new SpiImpl2());
//        content.executeSpiService(); // 执行接口的方法

        // SPI机制: 代替上面new的过程。使用spi 代替上面的对象new的过程。
        // 对象初始化，底层使用的反射。
        ServiceLoader<SPIService> loader = ServiceLoader.load(SPIService.class); // 懒加载迭代器。
        Iterator<SPIService> iterator = loader.iterator();
//        loader = ServiceLoader.load(Processor.class, classLoader); // 关键代码。
//        this.iterator = loader.iterator();

        // 通过while循环，完成方法注入调用
        while (iterator.hasNext()) { // 获取文本文件内容，得到需要实现类的名称
            SPIService spiService = iterator.next(); // 反射注入实现类的对象，延迟反射 nextService
            spiService.execute(); // 执行每个实现类中的方法
        }
        // 打印结果。
        // SpiImpl1.execute
        // SpiImpl2.execute
        // SpiImpl3.execute
    }

}

// javac 的源码。如何编译文件的。
/**
 * Main()---main()--compile---com.sun.tools.javac.main.Main("javac")
 * --com = JavaCompiler.instance(context)
 *     loader = ServiceLoader.load(Processor.class, classLoader); // 关键代码。
 *     this.iterator = loader.iterator();
 *
 *      comp.compile(fileObjects, classnames.toList(), processors); // Main.java
 *      initProcessAnnotations(processors);
 *      delegateCompiler = processAnnotations();
 */


